package com.quectel.sdk.kuangshi.monitor.model;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * 在这里编写说明
 * <p>
 * videos[] ar
 * ray
 * 放置视频布点信息的数组，内部可能会有多组视频信息。
 * {} obj 一组布控信息在此对象中，如果有多组布控将有多个对像
 * |—videoNo in
 * te
 * ger
 * 视频通道编号：支持16路视频，值为1~16
 * |—videoName st
 * ri
 * ng
 * 摄像头布点名称，由用户起名,这将是此布点的唯一标识，后续操作都依赖这个名称。以下规则：
 * l   支持1-50字节长度
 * l   支持英文大/小写字母、数字、半角下划线
 * 建议正则/^[a-zA-Z0-9_]{4,16}
 * |—url st
 * ri
 * ng
 * 主码流,通常为局域网内的RTSP地址。
 * |—subUrl st
 * ri
 * ng
 * 子码流,通常为局域网内的RTSP地址。
 * |—username st
 * ri
 * ng
 * IPC接入的用户名
 * |—password st
 * ri
 * ng
 * IPC接入的密码
 * |—rotation in
 * te
 * ger
 * 图像旋转的角度，为配合不同的摄像头安装角度，目前只支持4个值：0，90.180，270。分别代表顺
 * 时针旋转的角度0°，90°，180°，270°，如错误将检测不到人脸。如输入不为以上4个值，将默认
 * 为0°来处理。
 * |—
 * surveillanceEnab
 * led
 * bo
 * ol
 * 布控使能开关
 * |—
 * videoConStatus
 * in
 * te
 * ger
 * 视频流连接状态  0:连接成功 1:连接失败 2:认证失败 3:视频流格式错误 4:超出通道最大分辨率
 * 5:解码失败 6:超出最大解码能力
 * |—algRules[ ] ar
 * ray
 * 算法规则数组
 * { } obj
 * |—|—ruleIndex in
 * te
 * ger
 * 算法规则索引，暂只支持同时布控 4 种规则，取值 1 ~ 4
 * |—|—ruleEnable bo
 * ol
 * 算法规则使能，控制算法规则是否启用。true表示使能，false表示禁能
 * |—|—algType in
 * te
 * ger
 * 算法类型，根据不同的算法类型取不同的算法参数
 * 0 - 脸   人： 取下方结构化参数 structuresRule
 * 1 - 结构化： 取下方结构化参数 structuresRule
 * 10-周界警戒：取下方alertRules（以1.2格式解析）
 * 11-行为警戒：取下方alertRules（以1.2格式解析）
 * >=12 其他算法仓：取下方alertRules（以该表格格式解析）
 * |—|—
 * structuresRule
 * obj 结构化规则参数
 * |—|—|—
 * livenessEnabled
 * bo
 * ol
 * 是否开启活体
 * |—|—|—
 * livenessThreshold
 * fl
 * oat
 * 活体判断阈值，（0~100）之间的浮点数，当活体开关关闭时，该值非必须，如设置为0也相当于关
 * 闭，但会消耗系统资源。如需要关闭该功能可到configs公共参数设置接口进行设置，但所有视频都
 * 将不做活体检测。
 * |—|—|—
 * attributeEnabled
 * bo
 * ol
 * 是否开启属性分
 * |—|—|—
 * detectTargetList
 * []
 * ar
 * ray
 * 检测目标数组，至少包含如下五类目标中的一种
 * |—|—|—|—
 * targetName
 * st
 * ri
 * ng 
 * 检测目标名称，可取值如下，默认全选：
 * (1)人脸："face" 
 * (2)人形："human" 
 * (3)机动车："motorVehicle"，
 * (4)非机动车："nonMotorVehicle" 
 * (5)车牌："plate"
 * |—|—|—
 * pushConfigs{}
 * obj 推图参数配置
 * |—|—|—|—
 * pushMode
 * st
 * ri
 * ng
 * 0- 间隔推图模式，1- 最优推图模式，2 - 最快推图模式，3 - 无限推图
 * |—|—|—|—
 * retryCount
 * in
 * te
 * ger
 * 二次识别次数。限定条件：0~5000次范围，0代表不进行二次识别；默认5次。仅在最快推图模式下生
 * 效
 * |—|—|—|—
 * retryInterval
 * in
 * te
 * ger
 * 二次识别的间隔时长。限定条件：0~60秒范围，0代表关闭二次识别功能；默认为5秒。仅在最快推图
 * 模式下生效
 * |—|—|—|—
 * strangerRetryCou
 * nt
 * in
 * te
 * ger
 * 陌生人重新判定次数。对识别结果进行计数，如结果为未识别或陌生人，连续判断平均值低于陌生人
 * 阈值，将判定为陌生人。如为陌生人，将产生陌生人报警输出。范围：0~5次，默认为2次。
 * |—|—|—|—
 * pushInterval
 * in
 * te
 * ger
 * 最小推图间隔。（500-10000，单位是毫秒，默认500ms）
 * |—|—|—|—
 * maxPushNumber
 * in
 * te
 * ger
 * 最优推图的最大张数推图张数。限定条件：1~10张，默认1张
 * |—|—|—
 * captureConfigs{}
 * obj 抓拍模式参数配置
 * |—|—|—|—
 * captureMode
 * in
 * te
 * ger
 * 抓拍模式，默认为全抓拍模式：
 * l   0：全抓模式
 * 算法检测到目标（人、车、脸、车牌），不用质量判断模型过滤目标，抓到的目标全推出来
 * l   1：高质量模式，默认模式
 * 只抓拍满足“质量阈值”的目标，其中质量阈值的定义针对不同目标包含不同维度
 * l   2：自定义模式
 * 只抓拍满足“用户定义质量阈值”的目标
 * |—|—|—|—
 * quality{}
 * obj 视频结构化质量，非必选。上述抓拍模式配置为”自定义模式“时使用
 * |—|—|—|—|—
 * faceQuality 
 * in
 * te
 * ger
 *  人脸综合质量 取值范围【0,100】
 * |—|—|—|—|—
 * humanQuality
 * in
 * te
 * ger
 *  人形综合质量 取值范围【0,100】
 * |—|—|—|—|—
 * motorVehicleQual
 * ity
 * in
 * te
 * ger
 *  机动车综合质量 取值范围【0,100】
 * |—|—|—|—|—
 * nonMotorVehicleQ
 * uality
 * in
 * te
 * ger
 *  非机动车综合质量 取值范围【0,100】
 * |—|—|—|—|—
 * plateQuality
 * in
 * te
 * ger
 *  车牌综合质量 取值范围【0,100】
 * |—|—|—filter
 * {}
 * obj 过滤条件，条件越高，通过抓拍的人脸将越少，但人脸质量越高，识别的效果会越高。如条件越低，
 * 通过抓拍的人脸会越多，但人脸质量下线会降低，影响识别的效果。
 * |—|—|—|—roll in
 * te
 * ger
 * 人脸旋转角度限制（0~180），建议<=45°
 * |—|—|—|—yaw in
 * te
 * ger
 * 人脸水平角度限制（0~100），建议<=35°
 * |—|—|—|—
 * pitch
 * in
 * te
 * ger
 * 人脸垂直角度限制（0~100），建议<=45°
 * |—|—|—|—
 * blurness
 * fl
 * oat
 * 图像清晰度限制（0~100），建议<=60
 * |—|—|—|—
 * faceMin
 * in
 * te
 * ger
 * 人脸允许的长或宽的最小像素（20~380），值越小识别效果越差，建议>=80
 * |—|—|—|—
 * bodyMin
 * in
 * te
 * ger
 * 人体允许的长或宽的最小像素（20~380），值越小识别效果越差，建议>=80
 * |—|—|—group[] ar
 * ray
 * 如关联多个分组，在数组中添加多个项
 * {} obj 设定关联的分组与有效时间，最多20组。
 * |—|—|—|—
 * groupName
 * st
 * ri
 * ng
 * 必填，视频绑定的人脸分组名称，视频中抓拍的人脸将与这个group中的人脸进行识别。如高于比对
 * 阈值将引发报警或允许通行动作
 * |—|—|—|—
 * startTime
 * st
 * ri
 * ng
 * 必填，该绑定分组有效的开始时间，格式：HHMMSS，例子：“080000” ，为24小时制，默认为
 * “000000”
 * |—|—|—|—
 * endTime
 * st
 * ri
 * ng
 * 必填，该绑定分组失效的开始时间，格式：HHMMSS，例子：“184500” ，为24小时制，默认为
 * “000000”，如startTime与endTime两个值都为默认值“000000”，将24小时有效，不支持跨天
 * |—|—|—|—
 * searchThresholdH
 * igh
 * fl
 * oat
 * 必填，人脸识别的高限阈值,（0~100）之间的浮点数，如最高相似度的超过阈值，可通过Alert接口
 * 得到超阈值的不同组里的比对相似度列表。建议70~80，具体值根据实际情况调整
 * |—|—|—|—
 * searchThresholdL
 * ow
 * fl
 * oat
 * 必填，人脸识别的低限阈值,（0~100）之间的浮点数，如最高相似度低于低线阈值，代表这是一个陌
 * 生人。可通过Alert接口得到低阈值的不同组里的比对相似度列表
 * |—|—|—
 * globalStranger{}
 * obj 非必填，全局陌生人配置
 * |—|—|—|—
 * enable
 * bo
 * ol
 * 必填，配置开关 true 启用 false 禁用
 * |—|—|—|—
 * searchThresholdL
 * ow
 * in
 * te
 * ger
 * 必填，人脸识别的低限阈值,（0~100）之间的数，如最高相似度低于低线阈值，代表这是一个陌生
 * 人。建议：20，可通过Alert接口得到低阈值的不同组里的比对相似度列表
 * |—|—|—|—
 * startTime
 * st
 * ri
 * ng
 * 必填，该绑定分组有效的开始时间，格式：HHMMSS，例子：“080000” ，为24小时制，默认为
 * “000000”
 * |—|—|—|—
 * endTime
 * st
 * ri
 * ng
 * 必填，该绑定分组失效的开始时间，格式：HHMMSS，例子：“184500” ，为24小时制，默认为
 * “000000”，如startTime与endTime两个值都为默认值“000000”，将24小时有效
 * |—|—alertRules
 * { }
 * obj 类警戒算法规则，一个算法支持两个子规则
 * |—|—|—proc st
 * ri
 * ng
 * 固定值，表示process = init_rules 是
 * |—|—|—width in
 * te
 * ger
 * 视频分辨率-宽（0 ~ 1920）当使用归一化坐标时，可省略 否
 * |—|—|—height in
 * te
 * ger
 * 视频分辨率-高（0 ~ 1080) 当使用归一化坐标时，可省略 否
 * |—|—|—fps do
 * ub
 * le
 * 业务层送帧给sdk的帧率, 一般由算法仓开发人员推荐， 如警戒为8fps, 城管为0.5 目前统一由算
 * 法抽帧
 * 否
 * |—|—|—
 * customizedOption
 * s{}
 * obj 是
 * |—|—|—|—
 * area_list[]
 * ar
 * ray
 * roi区域list 是
 * {} obj
 * |—|—|—|—|—
 * area_type
 * st
 * ri
 * ng 
 * 区域类型，详见26.3算法仓数据字典-区域类型 MegBox-B4H Web API接口说明v2.0.0#区域类型字典 是
 * |—|—|—|—|—
 * area_id 
 * in
 * te
 * ger
 * roi id, 需要唯一，最多支持4个ROI区域和2个屏蔽区域，规则1区域id 1-4，规则2区域id 5-8，屏
 * 蔽区域id 9-10
 * 是
 * |—|—|—|—|—
 * alertor_ids[]
 * ar
 * ray
 * 该roi区域关联的警报器，填写alertor_id 是 
 * |—|—|—|—|—
 * points[]
 * ar
 * ray
 * 多边形的顶点坐标，使用双拌线时， 由于包含两条拌线，points项格式详见该表格下方 是
 * {} obj
 * |—|—|—|—|—
 * |—x
 * do
 * ub
 * le
 * 多边形顶点x坐标 （0 ~ 1)  归一化坐标 是
 * |—|—|—|—|—
 * |—y
 * do
 * ub
 * le
 * 多边形顶点x坐标 （0 ~ 1)  归一化坐标 是
 * |—|—|—|—|—
 * detect_roi_point
 * s[]
 * ar
 * ray
 * 出入口人数计数检测区域顶点坐标；只有出入口人数计数规则使用，下发该区域，则算法根据该区域
 * 跟踪人员track，如果未下发该区域，则算法根据整个画面跟踪人员track
 * 否
 * |—|—|—|—|—
 * |—x
 * do
 * ub
 * le
 * 区域顶点x坐标 （0 ~ 1)  归一化坐标 否
 * |—|—|—|—|—
 * |—y
 * do
 * ub
 * le
 * 区域顶点x坐标 （0 ~ 1)  归一化坐标 否
 * |—|—|—|—
 * alertor_configs
 * []
 * ar
 * ray
 * 报警器list
 * {} obj
 * |—|—|—|—|—
 * alertor_id
 * in
 * te
 * ger
 * 报警器id, 需唯一， 目前支持两个规则，id为1、2； 若为屏蔽区域规则，则id为3 是
 * |—|—|—|—|—
 * alertor_type[]
 * ar
 * ray
 * 报警事件,详见26.3算法仓数据字典-事件类型 MegBox-B4H Web API接口说明v2.0.0#事件类型字典 是
 * |—|—|—|—|—
 * target_min
 * do
 * ub
 * le
 * 目标大小过滤逻辑，目标面积占图片面积最小比例 0.00<=target_min<target_max<=1.00 默认
 * 0.05
 * 是
 * |—|—|—|—|—
 * target_max
 * do
 * ub
 * le
 * 目标大小过滤逻辑，目标面积占图片面积最大比例 0.00<=target_min<target_max<=1.00 默认0.5 是
 * |—|—|—|—|—
 * target_type[]
 * ar
 * ray
 * 目标类型，详见26.3算法仓数据字典-目标类型 MegBox-B4H Web API接口说明v2.0.0#目标类型字典 是
 * |—|—|—|—|—
 * allowed_colors[]
 * ar
 * ray
 * alertor_type里面含安全工服时必填，未含时不填
 * red：红色
 * blue：蓝色
 * yellow：黄色
 * gray：灰色
 * 安全工服支持红黄蓝灰自定义配置报警，工服颜色不符合规定，未穿戴工服均报警
 * alertor_type里面含安全工服时必填
 * |—|—|—|—|—
 * expected_num
 * int alertor_type里面含消防设施时必填，未含时不填
 * 希望画面中出现的灭火器个数，默认为1，画面中灭火器个数少于 'expected_num' 会触发报
 * 警  【0-50】
 * alertor_type里面含消防设施时必填，未
 * 含时不填
 * |—|—|—|—|—
 * target_min_num
 * in
 * te
 * ger
 * alertor_type里面含人员离岗时必填，未含时不填
 * 目标个数最小值 [0-50]  必须比target_max_num小
 * alertor_type里面含人员离岗时必填，未
 * 含时不填
 * |—|—|—|—|—
 * target_max_num
 * in
 * te
 * ger
 * alertor_type里面含人员离岗时必填，未含时不填
 * 目标个数最大值 [0-50] 必须比target_min_num大
 * alertor_type里面含人员离岗时必填，未
 * 含时不填
 * |—|—|—|—|—
 * obj_count
 * alertor_type里面含人员聚集时必填，未含时不填
 * 区域内的人数>=obj_count时才会报警  [0-50]
 * alertor_type里面含人员聚集时必填，未
 * 含时不填
 * |—|—|—|—|—
 * duty_ratio
 * fl
 * oat
 * 值域为 0 - 1，只有alertor_type里面含杂物堆放(sundry_detect)有该参数，表示当杂物与布控区
 * 域比例大于该值时才报警
 * 只有alertor_type里面含杂物堆放
 * (sundry_detect)有该参数
 * |—|—|—|—|—
 * interrupt_endura
 * nce
 * in
 * te
 * ger
 * 单位是秒，只有物品算法仓（即目前alertor_type里面含杂物堆放(sundry_detect)时）必填，其他
 * 不填
 * 当 Track 连续 interrupt_endurance 帧不满足报警，则会重新记录这个 Track，之前累计的
 * 满足报警状态帧数会被清空
 * 只有物品算法仓（即目前alertor_type里
 * 面含杂物堆放(sundry_detect)时）必填，
 * 其他不填
 * |—|—|—|—|—
 * personPreOverWall
 * int alertor_type里面含翻墙（overwall）时必填，未含时不填
 *  
 * 表示人员预翻墙是否报警
 * alertor_type里面含overwall时必填，未
 * 含时不填
 * |—|—|—|—|—
 * cooldown_duration
 * in
 * te
 * ger
 * 报警间隔，单位：秒  范围： 0-23h59m59s 是
 * |—|—|—|—|—
 * duration
 * in
 * te
 * ger
 * 目标事件持续多久报警, 单位：秒  范围：0~1800秒 是
 * |—|—|—|—|—
 * timeRange
 * ar
 * ray
 * 布控时段[0,86400]，(0秒到24*3600秒)
 *
 * @author: rananxin
 * @email: ryan.ran@quectel.com
 * @date: 2023-01-16 09:51:00
 */
@NoArgsConstructor
@Data
public class SyncVideoResp {


    /**
     * videos
     */
    private List<VideosCls> videos;

    /**
     * VideosCls
     */
    @NoArgsConstructor
    @Data
    public static class VideosCls {
        /**
         * videoNo
         */
        private Integer videoNo;
        /**
         * videoName
         */
        private String videoName;
        /**
         * videoType
         */
        private String videoType;
        /**
         * url
         */
        private String url;
        /**
         * subUrl
         */
        private String subUrl;
        /**
         * username
         */
        private String username;
        /**
         * password
         */
        private String password;
        /**
         * rotation
         */
        private Integer rotation;
        /**
         * surveillanceEnabled
         */
        private Boolean surveillanceEnabled;
        /**
         * videoConStatus
         */
        private Integer videoConStatus;
        /**
         * registerStatus
         */
        private Integer registerStatus;
        /**
         * algRules
         */
        private List<AlgRulesCls> algRules;

        /**
         * AlgRulesCls
         */
        @NoArgsConstructor
        @Data
        public static class AlgRulesCls {
            /**
             * ruleIndex
             */
            private Integer ruleIndex;
            /**
             * ruleEnable
             */
            private Boolean ruleEnable;
            /**
             * algType
             */
            private Integer algType;
            /**
             * structuresRule
             */
            private StructuresRuleCls structuresRule;

            /**
             * StructuresRuleCls
             */
            @NoArgsConstructor
            @Data
            public static class StructuresRuleCls {
                /**
                 * livenessEnabled
                 */
                private Boolean livenessEnabled;
                /**
                 * livenessThreshold
                 */
                private Integer livenessThreshold;
                /**
                 * attributeEnabled
                 */
                private Boolean attributeEnabled;
                /**
                 * pushConfigs
                 */
                private PushConfigsCls pushConfigs;
                /**
                 * detectTargetList
                 */
                private List<String> detectTargetList;
                /**
                 * captureConfigs
                 */
                private CaptureConfigsCls captureConfigs;
                /**
                 * filter
                 */
                private FilterCls filter;
                /**
                 * group
                 */
                private List<?> group;
                /**
                 * globalStranger
                 */
                private GlobalStrangerCls globalStranger;
                /**
                 * bestStrangerUpload
                 */
                private Boolean bestStrangerUpload;

                /**
                 * PushConfigsCls
                 */
                @NoArgsConstructor
                @Data
                public static class PushConfigsCls {
                    /**
                     * pushMode
                     */
                    private Integer pushMode;
                    /**
                     * retryCount
                     */
                    private Integer retryCount;
                    /**
                     * retryInterval
                     */
                    private Integer retryInterval;
                    /**
                     * maxPushNumber
                     */
                    private Integer maxPushNumber;
                    /**
                     * pushInterval
                     */
                    private Integer pushInterval;
                    /**
                     * strangerRetryCount
                     */
                    private Integer strangerRetryCount;
                }

                /**
                 * CaptureConfigsCls
                 */
                @NoArgsConstructor
                @Data
                public static class CaptureConfigsCls {
                    /**
                     * captureMode
                     */
                    private Integer captureMode;
                    /**
                     * quality
                     */
                    private QualityCls quality;

                    /**
                     * QualityCls
                     */
                    @NoArgsConstructor
                    @Data
                    public static class QualityCls {
                        /**
                         * faceQuality
                         */
                        private Integer faceQuality;
                        /**
                         * humanQuality
                         */
                        private Integer humanQuality;
                        /**
                         * motorVehicleQuality
                         */
                        private Integer motorVehicleQuality;
                        /**
                         * nonMotorVehicleQuality
                         */
                        private Integer nonMotorVehicleQuality;
                        /**
                         * plateQuality
                         */
                        private Integer plateQuality;
                    }
                }

                /**
                 * FilterCls
                 */
                @NoArgsConstructor
                @Data
                public static class FilterCls {
                    /**
                     * roll
                     */
                    private Integer roll;
                    /**
                     * yaw
                     */
                    private Integer yaw;
                    /**
                     * pitch
                     */
                    private Integer pitch;
                    /**
                     * blurness
                     */
                    private Integer blurness;
                    /**
                     * faceMin
                     */
                    private Integer faceMin;
                    /**
                     * bodyMin
                     */
                    private Integer bodyMin;
                }

                /**
                 * GlobalStrangerCls
                 */
                @NoArgsConstructor
                @Data
                public static class GlobalStrangerCls {
                    /**
                     * enable
                     */
                    private Boolean enable;
                    /**
                     * searchThresholdLow
                     */
                    private Integer searchThresholdLow;
                    /**
                     * startTime
                     */
                    private String startTime;
                    /**
                     * endTime
                     */
                    private String endTime;
                }
            }
        }
    }
}
